package econfigcenter

import (
    "path"
    "strings"
    "errors"
    "strconv"
    "encoding/json"

    "git.edaijia-inc.cn/edaijia/ego/econfigcenter/go_qconf"
)

var ErrKeyNoFound error = errors.New("key no found in QConf")

const (
    CONFIG_CENTER_PREFIX = "/configcenter"
)

func keyPath(zone, key string) string {
    return path.Join(CONFIG_CENTER_PREFIX, zone, key)
}

func zonePath(zone string) string {
    return path.Join(CONFIG_CENTER_PREFIX, zone)
}


/*
 * 获取string类型配置
 * 参数: zone 命名空间
 *       key  键名
 *       defaultValue 默认值
 * 返回值: string 键值, 当出错或不存在时返回默认值
 *         error qconf错误，这里对不存在错误进行了屏蔽
 */
func GetStringConf(zone, key string, defaultValue string) (string, error) {
    value, err := go_qconf.GetConf(keyPath(zone, key), "", go_qconf.QCONF_GET_NOWAIT)
    if err != nil {
        if err == go_qconf.ErrQconfNotFound {
            return defaultValue, nil
        } else {
            return defaultValue, err
        }
    }

    return strings.Trim(value, " "), nil
}

/*
 * 获取Bool类型配置
 * 参数: zone 命名空间
 *       key  键名
 *       defaultValue 默认值
 * 返回值: bool 键值, 当出错或不存在时返回默认值
 *         error qconf错误，这里对不存在错误进行了屏蔽
 */
func GetBoolConf(zone, key string, defaultValue bool) (bool, error) {
    value, err := go_qconf.GetConf(keyPath(zone, key), "", go_qconf.QCONF_GET_NOWAIT)
    if err != nil {
        if err == go_qconf.ErrQconfNotFound {
            return defaultValue, nil
        } else {
            return defaultValue, err
        }
    }

    boolValue, err := strconv.ParseBool(value)
    if err != nil {
        return defaultValue, err
    }

    return boolValue, nil
}

/*
 * 获取Int类型配置
 * 参数: zone 命名空间
 *       key  键名
 *       defaultValue 默认值
 * 返回值: int64 键值, 当出错或不存在时返回默认值
 *         error qconf错误，这里对不存在错误进行了屏蔽
 */
func GetIntConf(zone, key string, defaultValue int64) (int64, error) {
    value, err := go_qconf.GetConf(keyPath(zone, key), "", go_qconf.QCONF_GET_NOWAIT)
    if err != nil {
        if err == go_qconf.ErrQconfNotFound {
            return defaultValue, nil
        } else {
            return defaultValue, err
        }
    }

    intValue, err := strconv.ParseInt(value, 10, 64)
    if err != nil {
        return defaultValue, err
    }

    return intValue, nil
}

/*
 * 获取Float类型配置
 * 参数: zone 命名空间
 *       key  键名
 *       defaultValue 默认值
 * 返回值: int64 键值, 当出错或不存在时返回默认值
 *         error qconf错误，这里对不存在错误进行了屏蔽
 */
func GetFloatConf(zone, key string, defaultValue float64) (float64, error) {
    value, err := go_qconf.GetConf(keyPath(zone, key), "", go_qconf.QCONF_GET_NOWAIT)
    if err != nil {
        if err == go_qconf.ErrQconfNotFound {
            return defaultValue, nil
        } else {
            return defaultValue, err
        }
    }

    floatValue, err := strconv.ParseFloat(value, 64)
    if err != nil {
        return defaultValue, err
    }

    return floatValue, nil
}

/*
 * 获取Json格式的配置
 * 参数: zone 命名空间
 *       key  键名
 *       value json解析结果, 根据数据类型传入slice,map,struct地址
 * 返回值: error qconf错误
 */
func GetJsonConf(zone, key string, value interface{}) error {
    jsonValue, err := go_qconf.GetConf(keyPath(zone, key), "", go_qconf.QCONF_GET_NOWAIT)
    if err != nil {
        if err == go_qconf.ErrQconfNotFound {
            return ErrKeyNoFound
        } else {
            return err
        }
    }

    err = json.Unmarshal([]byte(jsonValue), value)
    if err != nil {
        return err
    }

    return nil
}
